package sf.database.jdbc.sql;

import sf.common.wrapper.Page;

import java.sql.Connection;
import java.util.List;
import java.util.Map;

/**
 * 直接执行sql模版语句，sql是模板
 * @author sxf
 */
public interface CrudTemplateSourceInf {
    /**
     * @param conn
     * @param sqlTemplate
     * @param parameters
     * @return
     * @
     */
    int[] executeBatch(Connection conn, String sqlTemplate, List<Map<String, Object>> parameters);

    /**
     * @param conn
     * @param sqlTemplate
     * @param parameters
     * @param insertFast
     * @param batchSize
     * @param pkeys
     * @param keyValues
     * @return
     */
    int[] executeBatch(Connection conn, String sqlTemplate, List<Map<String, Object>> parameters, boolean insertFast,
                       int batchSize, List<String> pkeys, List<Map<String, Object>> keyValues);

    /**
     * @param conn
     * @param pkeys
     * @param keyValues
     * @param sqlTemplate
     * @param paramters
     * @return
     */
    int insert(Connection conn, List<String> pkeys, Map<String, Object> keyValues, String sqlTemplate, Map<String, Object> paramters);

    /**
     * @param conn
     * @param sqlTemplate
     * @param parameters
     * @return
     * @
     */
    int execute(Connection conn, String sqlTemplate, Map<String, Object> parameters);

    /**
     * @param conn
     * @param start
     * @param limit
     * @param beanClass
     * @param sqlTemplate
     * @param parameters
     * @param <T>
     * @return
     * @
     */
    <T> Page<T> selectPage(Connection conn, long start, int limit, Class<T> beanClass, String sqlTemplate,
                           Map<String, Object> parameters);

    /**
     * 最原始的分页方法,使用原生sql实现
     * @param conn
     * @param start            起始位置
     * @param limit            限制数量
     * @param beanClass        返回结果,可以为实体类,Map,List,Object[]
     * @param countSqlTemplate 查询总数的语句id
     * @param countParas       查询总数的参数
     * @param pageSqlTemplate  分页列表查询语句id,必须包含了start和limit的内容
     * @param pageParas        分页列表查询参数
     * @param <T>              泛型
     * @return 分页结果
     */
    <T> Page<T> selectRealPageRaw(Connection conn, long start, int limit, Class<T> beanClass, String countSqlTemplate, Map<String, Object> countParas,
                                  String pageSqlTemplate, Map<String, Object> pageParas);

    /**
     * 最原始的分页方法,使用原生sql实现
     * @param conn
     * @param start            起始位置
     * @param limit            限制数量
     * @param beanClass        返回结果,可以为实体类,Map,List,Object[]
     * @param countSqlTemplate 查询总数的语句id
     * @param countParas       查询总数的参数
     * @param listSqlTemplate  分页列表查询语句id,必须包含了start和limit的内容
     * @param listParas        分页列表查询参数
     * @param <T>              泛型
     * @return 分页结果
     */
    <T> Page<T> selectFakePageRaw(Connection conn, long start, int limit, Class<T> beanClass, String countSqlTemplate, Map<String, Object> countParas,
                                  String listSqlTemplate, Map<String, Object> listParas);

    /**
     * @param conn
     * @param sqlTemplate
     * @param parameters
     * @return
     * @
     */
    Object[] selectArray(Connection conn, String sqlTemplate, Map<String, Object> parameters);

    /**
     * @param conn
     * @param beanClass
     * @param sqlTemplate
     * @param parameters
     * @param <T>
     * @return
     * @
     */
    <T> List<T> selectList(Connection conn, Class<T> beanClass, String sqlTemplate, Map<String, Object> parameters);

    /**
     * @param conn
     * @param beanClass
     * @param sqlSource
     * @param paramters
     * @param start
     * @param limit
     * @param <T>
     * @return
     */
    <T> List<T> selectList(Connection conn, Class<T> beanClass, String sqlSource, Map<String, Object> paramters, long start, int limit);

    /**
     * @param conn
     * @param beanClass
     * @param sqlTemplate
     * @param parameters
     * @param <T>
     * @return
     */
    <T> T selectOne(Connection conn, Class<T> beanClass, String sqlTemplate, Map<String, Object> parameters);

    /**
     * @param conn
     * @param sqlTemplate
     * @param parameters
     * @return
     */
    List<Map<String, Object>> select(Connection conn, String sqlTemplate, Map<String, Object> parameters);

    /**
     * @param conn
     * @param ormIt
     * @param returnClass
     * @param sqlTemplate
     * @param paramters
     * @param <T>
     */
    <T> void selectIterator(Connection conn, OrmIterator<T> ormIt, Class<T> returnClass, String sqlTemplate, Map<String, Object> paramters);

    /**
     * @param conn
     * @param ormStream
     * @param returnClass
     * @param sqlTemplate
     * @param paramters
     * @param <T>
     */
    <T> void selectStream(Connection conn, OrmStream<T> ormStream, Class<T> returnClass, String sqlTemplate, Map<String, Object> paramters);

}
